home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / applications / wp / macro28.lha / Macro / FinsGold / TeX / ScanTeXErrors.ged < prev    next >
Encoding:
Text File  |  1994-03-16  |  9.9 KB  |  306 lines

  1. /* $VER: ScanTeXErrors.ged V 0.8 © 1994 Fin Schuppenhauer */
  2. /**
  3.    Lädt das Logfile zum aktuellen Text und zeigt alle Fehler der
  4.    Reihe nach an. Fehler, die nicht zum aktuellen Quelltext ge-
  5.    hören werden erkannt und bei bedarf wird die zugehörige Datei
  6.    nachgeladen.
  7.    Der Cursor wird auf der fehlerhaften Zeile positioniert und
  8.    die Fehlermeldung in einem Requester ausgegeben.
  9.    Nachdem das Logfile der Hauptdatei einmal geladen wurde, kann
  10.    auch von allen anderen Fenstern, die (La)TeX-Quelltext ent-
  11.    halten, der von der Hauptdatei nachgeladen wurde, dieses 
  12.    Makro aufgerufen werden.
  13.    Wenn der/die Texte neu übersetzt wurden, müssen die hier ggf.
  14.    erzeugten Clip-Variablen gelöscht und das Logfile-Fenster ge-
  15.    schlossen werden.
  16.    Dies erledigt das Makro "ResetTeXError.ged".
  17.  
  18.    Dieses Makro ist PUBLIC DOMAIN.
  19.  
  20.    Für Fehlerberichte, Anregungen, Wünsche, Geschenke, Lob,
  21.    Kritik, Teddybären, CDs, Disketten, Cassetten, Videofilme,
  22.    nützliche Programme und Utilities, spaßige Makros, geniale
  23.    Sytle-Files, Postkarten, Kuchen, Kekse, Bücher über ARexx,
  24.    Bücher allgemein, Bücher speziell, Briefmarken, Fotos,
  25.    Reisegutscheine, Einladungen, Freiflugtickets, Schokoloade
  26.    (weiß oder mit Trauben bevorzugt), nette E-Mails, nette
  27.    handgeschriebene Briefe, Festplatten (sowohl welche für
  28.    den Rechner als auch für Feten/Feste), Schallplatten, Tief-
  29.    kühlkostgerichte, Äpfel, Birnen und Banannen, Hägen-Daz-Eis,
  30.    Icestelli-Eis (Mmm, auf den Becher, lecker, lecker und
  31.    lecker!), ...
  32.    bin ich jederzeit dankbar und können an folgende Adresse
  33.    gesendet werden:
  34.  
  35.       Fin Schuppenhauer
  36.       Barußpark 10
  37.       20537 Hamburg
  38.       (Germany)
  39.  
  40.    Oder für die E-Mail-Freaks:
  41.  
  42.       schuppen@rzdspc2.informatik.uni-hamburg.de
  43.  
  44. **/
  45.  
  46. OPTIONS RESULTS                             /* enable return codes     */
  47.  
  48. if (LEFT(ADDRESS(), 6) ~= "GOLDED") then    /* not started by GoldEd ? */
  49.     address 'GOLDED.1'
  50.  
  51. 'LOCK CURRENT'                              /* lock GUI, gain access   */
  52. OPTIONS FAILAT 6                            /* ignore warnings         */
  53. SIGNAL ON SYNTAX                            /* ensure clean exit       */
  54.  
  55.  
  56. /* ------------------------ INSERT YOUR CODE HERE: ------------------- */
  57.  
  58. 'QUERY CAT'
  59. isGerman = (result = "deutsch")
  60.  
  61. /* RexxSupport.library öffnen: */
  62. if ~show('L', "rexxsupport.library") then do
  63.    if ~addlib('rexxsupport.library',0,-30,0) then do
  64.       if (isGerman) then
  65.          'REQUEST BODY="rexxsupport.library kann nicht geöffnet werden!" BUTTON="So''n Mist"'
  66.       else
  67.          'REQUEST BODY="Unable to open rexxsupport.library!" BUTTON="That''s bad!'
  68.       'UNLOCK'
  69.       EXIT
  70.    end
  71. end
  72.  
  73. 'QUERY DOC VAR DOCNAME'
  74. logname = left(docname, length(docname)-3) || log
  75. lp = 0
  76. lp = lastpos('/', docname)
  77. if lp = 0 then
  78.    lp = lastpos(':', docname)
  79. filename = right(docname, length(docname)-lp)
  80.  
  81. /* Haben wir auch einen (La)TeX-Quelltext im aktuellen Fenster? Dann */
  82. /* muß er ja auf .tex oder .sty enden:                               */
  83. if (right(docname,4) ~= '.tex') & (right(docname,4) ~= '.sty') then do
  84.    if (isGerman) then
  85.       'REQUEST BODY="Dies ist kein (La)TeX-Quelltext." BUTTON=Ok'
  86.    else
  87.       'REQUEST BODY="This is no (La)TeX source." BUTTON=Ok'
  88.    'UNLOCK'
  89.    EXIT
  90. end
  91.  
  92. if ~show('C', 'texfiles') then do
  93.    /* Das kann nur bedeuten, daß es noch kein Logfile geladen wurde: */
  94.    if exists(logname) then do
  95.       /* Logfile existiert: Ist es auch älter als das .tex/.sty-File?: */
  96.       docinfo = statef(docname)
  97.       loginfo = statef(logname)
  98.       docdays = subword(docinfo,5,1)
  99.       docmins = subword(docinfo,6,1)
  100.       doctick = subword(docinfo,7,1)
  101.       logdays = subword(loginfo,5,1)
  102.       logmins = subword(loginfo,6,1)
  103.       logtick = subword(loginfo,7,1)
  104.       if (doctick > logtick) & (docmins >= logmins) & (docdays >= logdays) then do
  105.          if (isGerman) then
  106.             'REQUEST BODY="Logfile ist älter als aktueller Text!|Bitte erst neu übersetzen." BUTTON=Ok'
  107.          else
  108.             'REQUEST BODY="Logfile is older then current text!|Please, compile first." BUTTON=Ok'
  109.          'UNLOCK'
  110.          EXIT
  111.       end
  112.       'UNLOCK'
  113.       /* Jetzt schalten wir um auf das Fenster mit unserem .log-File.   */
  114.       /* Sollte es ein deartiges Fenster nicht geben, sorgt dir Option  */
  115.       /* FORCE dafür, daß das Logfile gleich geladen wird.              */
  116.       /* Läßt es sich eigentlich verhindern, daß das neugeladene Fenster*/
  117.       /* nach vorne geholt und aktiviert wird?                          */
  118.       'WINDOW USE='logname' FORCE QUIET'
  119.       'LOCK NAME='logname' QUIET'
  120.  
  121.       /* Nun durchsuchen wir den Text nach dazugeladenen .tex-Dateien   */
  122.       /* und merken uns deren Namen, sowie den Zeilenbereich, den sie   */
  123.       /* beanspruchen (das hilft uns unten bei der Überprüfung, ob der  */
  124.       /* nächste gefundene Fehler auch zum aktuellen Quelltext gehört): */
  125.       texfile = logname
  126.       /* Das Hauptfile taucht zweimal auf (1. in der Parameterübergabe  */
  127.       /* zum TeX-Aufruf; 2. die Information daß das Hauptfile dazuge-   */
  128.       /* laden wurde. Danach können wir die Suche beginnen):            */
  129.       'FIND STRING='filename' FIRST'
  130.       'FIND STRING=.tex NEXT'
  131.       done = 0
  132.       do until done ~= 0
  133.          'FIND STRING=.tex NEXT QUIET'
  134.          if rc = 0 then do
  135.             'PING 1'
  136.             'PREV'
  137.             'QUERY WORD VAR WORT'
  138.             texfile = texfile' 'wort || '.tex'
  139.             /* Jetzt bestimmen wir den Zeilenbereich, denn diese     */
  140.             /* Datei im Logfile beansprucht:                         */
  141.             'FIND STRING=( PREV'
  142.             'QUERY ABSLINE VAR STARTLINE'
  143.             'PING 0'
  144.             ddone = 0
  145.             do until ddone ~= 0
  146.                'BRACKET MATCH'
  147.                if rc = 0 then
  148.                   ddone = 1
  149.                else do
  150.                   /* Keine passende schließende Klammer gefunden.    */
  151.                   /* Dies kann passieren, wenn der Übersetzungsvor-  */
  152.                   /* gang vorzeitig mit x unterbrochen wurde.        */
  153.                   'GOTO BOTTOM'
  154.                   'GOTO EOL STEP 1'
  155.                   'TEXT T=)'
  156.                   'PONG 0'
  157.                end
  158.             end
  159.             'QUERY ABSLINE VAR ENDLINE'
  160.             /* Die geholten Daten sichern: */
  161.             clipvalue = startline' 'endline
  162.             call setclip(wort'.tex', clipvalue)
  163.             /* Zurück zu der Stelle, wo wir .tex gefunden haben: */
  164.             'PONG 1'
  165.          end
  166.          else
  167.             /* Keine weitere .tex-Datei gefunden. */
  168.             done = 1
  169.       end
  170.       call setclip('texfiles', texfile)
  171.       call setclip('scanline', '1')
  172.    end
  173.    else do
  174.       if (isGerman) then
  175.          'REQUEST BODY="Logfile nicht gefunden!" BUTTON=Ok'
  176.       else
  177.          'REQUEST BODY="Logfile not found!" BUTTON = Ok'
  178.       'UNLOCK'
  179.       EXIT
  180.    end
  181. end
  182. /* Es gibt im Clip einen Eintrag texfiles, d.h. das Logfile wurde */
  183. /* bereits geladen.                                               */
  184. else do
  185.    /* Ist unsere akt. Datei auch darin enthalten, d.h. gibt es    */
  186.    /* im Clip einen Eintrag, der unserem Filenamen entspricht?    */
  187.    texfiles = getclip('texfiles')
  188.    clipvalue = getclip(filename)
  189.    if rc ~= 0 then do
  190.       if (isGerman) then
  191.          'REQUEST BODY="Kein Hinweis auf diese Datei|im geladenen Logfile!" BUTTON=Ok'
  192.       else
  193.          'REQUEST BODY="No information for this file|in loaded logfile!" BUTTON="I see"'
  194.       'UNLOCK'
  195.       EXIT
  196.    end
  197.    logwindow = subword(texfiles, 1, 1)
  198.    'UNLOCK'
  199.    /* FORCE, falls das Fenster zwischenzeitlich geschlossen wurde: */
  200.    'WINDOW USE='logwindow' FORCE QUIET'
  201.    'LOCK NAME='logwindow' QUIET'
  202. end
  203.  
  204. /* Hier beginnt nun endlich die Fehlersuche: */
  205. scanline = getclip('scanline')
  206. done = 0
  207. 'GOTO LINE='scanline
  208. do until done ~= 0
  209.    'FIND STRING=l. NEXT QUIET'
  210.    if rc = 0 then do
  211.       'QUERY COLUMN VAR CURRCOL'
  212.       if currcol <= 2 then do
  213.          'NEXT'
  214.          'QUERY WORD VAR ERRORLINE'
  215.          'QUERY ABSLINE VAR SCANLINE'
  216.          call setclip('scanline', scanline)
  217.          line = errorline
  218.          ddone = 0
  219.          do until ddone ~= 0
  220.             'FIND STRING=! PREV'
  221.             'QUERY COLUMN VAR CURRCOL'
  222.             if currcol = 1 then
  223.                ddone = 1
  224.          end
  225.          'QUERY BUFFER VAR CURRBUF'
  226.          currbuf = delword(currbuf, 1, 1)
  227.          done = 1
  228.       end
  229.    end
  230.    else do
  231.       /* Keinen weiteren Fehler gefunden: */
  232.       line = 0
  233.       done = 1
  234.    end
  235. end
  236.  
  237. if line ~= 0 then do
  238.    done = 0
  239.    do until done ~= 0
  240.       'FIND STRING=.tex PREV'
  241.       'PREV'
  242.       'QUERY WORD VAR WORT'
  243.       if scanline <= word(getclip(wort'.tex'),2) then do
  244.          'QUERY BUFFER VAR FNBUF'
  245.          lp = lastpos('.tex', fnbuf)
  246.          fnbuf = delstr(fnbuf, lp+4)
  247.          lp = lastpos('(', fnbuf)
  248.          fnbuf = right(fnbuf, length(fnbuf)-lp)
  249.          done = 1
  250.       end
  251.    end
  252.  
  253.    lp = 0
  254.    lp = lastpos('/', fnbuf)
  255.    if lp = 0 then
  256.       lp = lastpos(':', fnbuf)
  257.    fname = right(fnbuf, length(fnbuf)-lp)
  258.  
  259.    /* Zugehöriges Fenster suchen */
  260.    'QUERY WINDOWS VAR WINS'
  261.    done = 0
  262.    do i=0 to wins-1 while done = 0
  263.       'UNLOCK'
  264.       'WINDOW ORDINAL='i' QUIET'
  265.       'LOCK CURRENT'
  266.       'QUERY DOC VAR WINNAME'
  267.       if lastpos(fname, winname) ~= 0 then do
  268.          'WINDOW ORDINAL='i
  269.          done = 1
  270.       end
  271.    end
  272.    if done = 0 then do
  273.       'WINDOW USE='fnbuf' FORCE QUIET'
  274.       'QUERY WINDOWS VAR WINS'
  275.       wins = wins - 1
  276.       'UNLOCK'
  277.       'WINDOW ORDINAL='wins
  278.       'LOCK CURRENT'
  279.    end
  280.  
  281.    'GOTO LINE='errorline
  282.    if (isGerman) then
  283.       'REQUEST BODY="Fehler in Zeile 'errorline':|'currbuf'" BUTTON=Ok'
  284.    else
  285.       'REQUEST BODY="Error in line 'errorline':|'currbuf'" BUTTON=Ok.'
  286. end
  287. else do
  288.    'UNLOCK'
  289.    'LOCK NAME='docname
  290.    if (isGerman) then
  291.       'REQUEST BODY="Kein weitere Fehler." BUTTON=Prima'
  292.    else
  293.       'REQUEST BODY="No more errors." BUTTON=Good'
  294. end
  295.  
  296. /* ---------------------------- END OF YOUR CODE --------------------- */
  297.  
  298. 'UNLOCK' /* VERY important: unlock GUI */
  299. EXIT
  300.  
  301. SYNTAX:
  302.  
  303. SAY "Sorry, error line" SIGL ":" ERRORTEXT(RC) ":-("
  304. 'UNLOCK'
  305. EXIT
  306.